#!/usr/bin/env node

const { program } = require('commander');
const chalk = require('chalk');
const { generateByfuid, validateByfuidLength } = require('./index');

class ByfuidCLI {
  constructor() {
    this.console = console;
  }

  printError(message) {
    this.console.log(chalk.red('错误:'), message);
  }

  printSuccess(message) {
    this.console.log(chalk.green('成功:'), message);
  }

  printInfo(message) {
    this.console.log(chalk.blue('信息:'), message);
  }

  printWarning(message) {
    this.console.log(chalk.yellow('警告:'), message);
  }

  validateUserData(userData) {
    if (userData.length !== 12) {
      this.printError(`用户数据必须为12字符，当前为 ${userData.length} 字符`);
      return false;
    }
    return true;
  }

  validateCustomData(customData) {
    if (customData.length > 201) {
      this.printWarning('自定义数据超过201字符，将被截断');
    }
    return true;
  }

  generateByfuid(userData, customData, showDetails = false) {
    try {
      // 验证用户数据
      if (userData && !this.validateUserData(userData)) {
        return 1;
      }

      // 验证自定义数据
      if (customData && !this.validateCustomData(customData)) {
        return 1;
      }

      // 生成 BYFUID
      const byfuid = generateByfuid(userData, customData);

      // 显示结果
      this.console.log(chalk.green.bold('BYFUID 生成成功'));
      this.console.log(chalk.cyan('BYFUID 长度:'), `${byfuid.length} 字符`);
      this.console.log(chalk.cyan('生成引擎:'), 'JavaScript');
      
      if (userData) {
        this.console.log(chalk.cyan('用户数据:'), userData);
      }
      if (customData) {
        const displayCustom = customData.length > 50 ? 
          customData.substring(0, 50) + '...' : customData;
        this.console.log(chalk.cyan('自定义数据:'), displayCustom);
      }

      this.console.log('\n' + chalk.bold('生成的 BYFUID:'));
      this.console.log(byfuid);

      if (showDetails) {
        this.console.log('\n' + chalk.bold('详细信息:'));
        const details = [
          ['用户自由数据', '12 字符', '用户自定义或随机生成的12字符数据'],
          ['自定义数据', '201 字符', '支持中英文的自定义内容'],
          ['时间戳', '13 字符', '毫秒级时间戳'],
          ['数据校验', '24 字符', 'SHA256校验和的前24字符'],
          ['总计', '250 字符', '编码前原始数据长度'],
          ['最终BYFUID', '512 字符', 'Base64编码后的最终结果']
        ];

        details.forEach(([segment, length, description]) => {
          this.console.log(`  ${chalk.cyan(segment.padEnd(10))} ${chalk.yellow(length.padEnd(8))} ${description}`);
        });
      }

      return 0;
    } catch (error) {
      if (error.message.includes('用户自由数据必须为12字符')) {
        this.printError(error.message);
      } else {
        this.printError(`生成 BYFUID 时发生未知错误: ${error.message}`);
      }
      return 1;
    }
  }

  validateByfuid(byfuid) {
    try {
      const isValid = validateByfuidLength(byfuid);

      if (isValid) {
        this.console.log(
          chalk.green.bold('验证成功') + '\n' +
          chalk.cyan('BYFUID 长度验证通过') + '\n' +
          chalk.cyan('长度:') + ` ${byfuid.length} 字符`
        );
      } else {
        this.console.log(
          chalk.red.bold('验证失败') + '\n' +
          chalk.cyan('BYFUID 长度无效') + '\n' +
          chalk.cyan('当前长度:') + ` ${byfuid.length} 字符\n` +
          chalk.cyan('期望长度:') + ' 512 字符'
        );
      }

      return isValid ? 0 : 1;
    } catch (error) {
      this.printError(`验证 BYFUID 时发生错误: ${error.message}`);
      return 1;
    }
  }
}

// 配置命令行程序
program
  .name('byfuid')
  .description('BYFUID 生成器 - 高性能 BYFUID 生成工具')
  .version('0.1.1');

// generate 子命令
program
  .command('generate')
  .description('生成 BYFUID')
  .option('-u, --user-data <userData>', '12字符用户自由数据')
  .option('-c, --custom-data <customData>', '自定义数据（最多201字符）')
  .option('-d, --details', '显示详细信息')
  .action((options) => {
    const cli = new ByfuidCLI();
    const exitCode = cli.generateByfuid(
      options.userData,
      options.customData,
      options.details
    );
    process.exit(exitCode);
  });

// validate 子命令
program
  .command('validate <byfuid>')
  .description('验证 BYFUID')
  .action((byfuid) => {
    const cli = new ByfuidCLI();
    const exitCode = cli.validateByfuid(byfuid);
    process.exit(exitCode);
  });

// 显示帮助信息如果没有任何参数
if (process.argv.length === 2) {
  program.outputHelp();
  process.exit(0);
}

program.parse();